home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ccdl151s.zip / INCLUDE / GEN68.H < prev    next >
C/C++ Source or Header  |  1997-06-10  |  6KB  |  169 lines

  1. /*
  2.  * 68K/386 32-bit C compiler.
  3.  *
  4.  * copyright (c) 1996, David Lindauer
  5.  * 
  6.  * This compiler is intended for educational use.  It may not be used
  7.  * for profit without the express written consent of the author.
  8.  *
  9.  * It may be freely redistributed, as long as this notice remains intact
  10.  * and sources are distributed along with any executables derived from them.
  11.  *
  12.  * The author is not responsible for damages, either direct or consequential,
  13.  * that may arise from use of this software.
  14.  *
  15.  * v1.5 August 1996
  16.  * David Lindauer, gclind01@starbase.spd.louisville.edu
  17.  *
  18.  * Credits to Mathew Brandt for original K&R C compiler
  19.  *
  20.  */
  21. /*
  22.  *      code generation structures and constants
  23.  */
  24.  
  25. /* address mode specifications */
  26. #define F_DREG  1       /* data register direct mode allowed */
  27. #define F_AREG  2       /* address register direct mode allowed */
  28. #define F_MEM   4       /* memory alterable modes allowed */
  29. #define F_IMMED 8       /* immediate mode allowed */
  30. #define F_ALT   7       /* alterable modes */
  31. #define F_DALT  5       /* data alterable modes */
  32. #define F_FREG  16      /* FP register */
  33. #define F_INDX  64    /* indexed memory alterable mode allowed */
  34. #define F_ALL   63      /* all modes allowed */
  35. #define F_VOL   128      /* need volitile operand */
  36. #define F_NOVALUE 256    /* dont need result value */
  37. #define F_NOBIT 512    /* Don't get the bit val, get the address */
  38.  
  39. enum e_op {
  40.         op_reserved, op_line, op_seq, op_slit, op_label, op_funclabel, op_genword, 
  41.     op_dcl,op_dcr,
  42.     op_abcd,op_add,op_adda,op_addi,
  43.     op_addq,op_addx,op_and,op_andi,op_asl,op_asr,
  44.     op_bra,op_beq,op_bne,op_blt,op_ble,op_bgt,op_bge,
  45.     op_bhi,op_bhs,op_blo,op_bls,op_bsr,op_bcc,
  46.     op_bcs,op_bmi,op_bpl,op_bvc,op_bvs,op_bchg,
  47.     op_bclr,op_bfchg,op_bfclr,op_bfexts,op_bfextu,op_bfffo,
  48.     op_bfins,op_bfset,op_bftst,op_bkpt,op_bset,op_btst,
  49.     op_chk,op_chk2,op_clr,op_cmp,op_cmpa,op_cmpi,
  50.     op_cmpm,op_cmp2,op_dbeq,op_dbne,op_dblt,op_dble,op_dbgt,
  51.     op_dbge,op_dbhi,op_dbhs,op_dblo,op_dbls,op_dbsr,
  52.     op_dbcc,op_dbcs,op_dbmi,op_dbpl,op_dbvc,op_dbvs,
  53.     op_dbt,op_dbf,op_dbra,op_divs,op_divu,op_divsl,
  54.     op_divul,op_eor,op_eori,op_exg,op_ext,op_extb,
  55.     op_illegal,op_jmp,op_jsr,op_lea,op_link,op_lsl,
  56.     op_lsr,op_move,op_movea,op_movec,op_movem,op_movep,
  57.     op_moveq,op_moves,op_muls,op_mulu,op_nbcd,op_neg,
  58.     op_negx,op_nop,op_not,op_or,op_ori,op_pack,
  59.     op_pea,op_reset,op_rol,op_ror,op_roxl,op_roxr,
  60.     op_rtd,op_rte,op_rtr,op_rts,op_sbcd,op_seteq,
  61.     op_setne,op_setlt,op_setle,op_setgt,op_setge,op_sethi,op_seths,
  62.     op_setlo,op_setls,op_setsr,op_setcc,op_setcs,op_setmi,
  63.     op_setpl,op_setvc,op_setvs,op_sett,op_setf,op_sub,
  64.     op_stop,op_suba,op_subi,op_subq,op_subx,op_swap,
  65.     op_tas,op_trap,op_trapeq,op_trapne,op_traplt,op_traple,op_trapgt,
  66.     op_trapge,op_traphi,op_traphs,op_traplo,op_trapls,op_trapsr,
  67.     op_trapcc,op_trapcs,op_trapmi,op_trappl,op_trapvc,op_trapvs,
  68.     op_trapt,op_trapf,op_trapv,op_tst,op_unlk,op_unpk,
  69.     op_fabs,op_facos,op_fadd,op_fasin,op_fatan,op_fatanh,
  70.     op_fbeq,op_fbne,op_fbgt,op_fbngt,op_fbge,op_fbnge,
  71.     op_fblt,op_fbnlt,op_fble,op_fbnle,op_fbgl,op_fbngl,
  72.     op_fbgle,op_fbngle,op_fbogt,op_fbule,op_fboge,op_fbult,
  73.     op_fbolt,op_fbuge,op_fbole,op_fbugt,op_fbogl,op_fbueq,
  74.     op_fbor,op_fbun,op_fbt,op_fbf,op_fbst,op_fbsf,
  75.     op_fbseq,op_fbsne,op_fcmp,op_fcos,op_fcosh,op_fdbeq,
  76.     op_fdbne,op_fdbgt,op_fdbngt,op_fdbge,op_fdbnge,op_fdblt,
  77.     op_fdbnlt,op_fdble,op_fdbnle,op_fdbgl,op_fdbngl,op_fdbgle,
  78.     op_fdbngle,op_fdbogt,op_fdbule,op_fdboge,op_fdbult,op_fdbolt,
  79.     op_fdbuge,op_fdbole,op_fdbugt,op_fdbogl,op_fdbueq,op_fdbor,
  80.     op_fdbun,op_fdbt,op_fdbf,op_fdbst,op_fdbsf,op_fdbseq,
  81.     op_fdbsne,op_fdiv,op_fetox,op_fetoxm1,op_fgetexp,op_fgetman,
  82.     op_fint,op_fintrz,op_flog10,op_flog2,op_flogn,op_flognp1,
  83.     op_fmod,op_fmove,op_fmovecr,op_fmovem,op_fmul,op_fneg,
  84.     op_fnop,op_frem,op_fscale,op_fseq,op_fsne,op_fsgt,
  85.     op_fsngt,op_fsge,op_fsnge,op_fslt,op_fsnlt,op_fsle,
  86.     op_fsnle,op_fsgl,op_fsngl,op_fsgle,op_fsngle,op_fsogt,
  87.     op_fsule,op_fsoge,op_fsult,op_fsolt,op_fsuge,op_fsole,
  88.     op_fsugt,op_fsogl,op_fsueq,op_fsor,op_fsun,op_fst,
  89.     op_fsf,op_fsst,op_fssf,op_fsseq,op_fssne,op_fsgldiv,
  90.     op_fsglmul,op_fsin,op_fsincos,op_fsinh,op_fsqrt,op_fsub,
  91.     op_ftan,op_ftanh,op_ftentox,op_ftrapeq,op_ftrapne,op_ftrapgt,
  92.     op_ftrapngt,op_ftrapge,op_ftrapnge,op_ftraplt,op_ftrapnlt,op_ftraple,
  93.     op_ftrapnle,op_ftrapgl,op_ftrapngl,op_ftrapgle,op_ftrapngle,op_ftrapogt,
  94.     op_ftrapule,op_ftrapoge,op_ftrapult,op_ftrapolt,op_ftrapuge,op_ftrapole,
  95.     op_ftrapugt,op_ftrapogl,op_ftrapueq,op_ftrapor,op_ftrapun,op_ftrapt,
  96.     op_ftrapf,op_ftrapst,op_ftrapsf,op_ftrapseq,op_ftrapsne,op_ftst,
  97.     op_ftwotox
  98. };
  99.  
  100. enum e_am {
  101.         am_none, am_dreg, am_areg, am_freg, am_ind, am_ainc, am_adec, am_indx, am_baseindxaddr,
  102.         am_direct, am_adirect, am_immed, am_mask, am_fmask, am_baseindxdata, am_pcindx,
  103.     am_divsl, am_bf, am_sr };
  104. /*      addressing mode structure       */
  105.  
  106. struct amode {
  107.         enum e_am       mode;
  108.         char            preg;
  109.         char            sreg;
  110.     char        scale;
  111.         char            tempflag;
  112.         struct enode    *offset;
  113.         };
  114.  
  115. /*      output code structure   */
  116.  
  117. struct ocode {
  118.         struct ocode    *fwd, *back;
  119.         enum e_op       opcode;
  120.         short           length;
  121.         struct amode    *oper1, *oper2,*oper3;
  122.     long addr;
  123.     char noopt;
  124.     char diag;
  125.         };
  126.  
  127. /* Used for fixup gen */
  128. typedef struct dl {
  129.         struct dl *next;
  130.         SYM *sp;
  131.         int offset;
  132.         short type;
  133. } DATALINK;
  134.  
  135. #define AMODE struct amode
  136. #define OCODE struct ocode
  137.  
  138.  
  139. enum e_gt { nogen, bytegen, wordgen, longgen, floatgen, doublegen, longdoublegen, srrefgen };
  140. enum e_sg { noseg, codeseg, dataseg, bssxseg,startupxseg,rundownxseg,cppxseg,fixcseg,fixdseg };
  141.  
  142.  
  143. /*  structures for binary code gen: mem arenas and fixups
  144.  */
  145. typedef struct _arena {
  146.     struct _mem {
  147.         struct _arena *link;
  148.         unsigned char *mem;
  149.     } *m,*active;
  150.     long size;
  151.     long pos;
  152.     short id;
  153.     struct _fixup {
  154.         struct _fixup *link;
  155.         SYM *sp;
  156.         long address;
  157.         long offset;
  158.         long label;
  159.         char size;
  160.         char pcrel;
  161.         char pureofs;
  162.     } *head,*tail;
  163. } ARENA;
  164.  
  165. typedef struct _mem MEM;
  166. typedef struct _fixup FIXUP;
  167.  
  168. #define MEMSIZE 1024    /* size of the smallest hunk in an arena */
  169. #include "cc68.p"